//
// Created by mio on 25-4-14.
//

#ifndef TCPSERVER_H
#define TCPSERVER_H

#include <memory>
#include <string>
#include "TcpConnection.h"
#include <unordered_map>

#include "TcpSocket.h"
#include "TcpConnection.h"

class EventLoop;
class Acceptor;

class TcpServer
{
public:
    TcpServer(EventLoop* eventloop);
    ~TcpServer();
    /**
     * @brief 启动服务器，开始在指定的 IP 和端口上监听。
     * @param ip 要监听的 IP 地址。
     * @param port 要监听的端口号。
     * @return true 如果成功启动监听；false 如果启动失败。
     */
    bool Start(std::string ip, uint16_t port);
    /**
     * @brief 停止服务器。
     * 停止接受新连接，并尝试断开所有现有连接。
     */
    void Stop();

    inline std::string GetIPAddress() const { return ip_; }
    inline uint16_t GetPort() const { return port_; }

protected:
    virtual TcpConnectionPtr OnConnect(int fd);
    virtual void AddConnection(int fd, TcpConnectionPtr conn);
    virtual void RemoveConnection(int fd);

private:
    EventLoop* loop_;
    uint16_t port_;
    std::string ip_;
    // 使用 unique_ptr 管理 Acceptor 对象，TcpServer 拥有 Acceptor
    std::unique_ptr<Acceptor> acceptor_;
    bool is_started_ = false;
    std::unordered_map<int, TcpConnectionPtr> connections_;
    std::mutex mtx_;
};

#endif //TCPSERVER_H
